"""
Python with上下文管理器：高效稳定处理文件资源

在上一节课中，我们学习了使用open()函数打开文件，然后显式调用close()关闭文件的方法。
这节课我们将学习更优雅、更安全的文件处理方式 —— with上下文管理器。

使用with语句处理文件可以自动关闭文件，无需手动调用close()方法，
能有效避免因异常导致文件未正确关闭的问题。
**学完本节课，上节课的方法你也可以忘掉了。**
"""

print("="*60)
print("Python with上下文管理器")
print("="*60)

# =============== 1. with语句的基本语法 ===============

print("\n1. with语句的基本语法")
print("-"*40)

print("""
with语句的基本语法如下：

    with open(file_path, mode) as file_object:
        # 对文件进行操作
        ...
    
    # 当离开with代码块时，文件会自动关闭
    # 此处file_object已关闭

这里的关键点是：
1. 使用"as"将打开的文件赋值给一个变量
2. 缩进的代码块内可以对文件进行操作
3. 离开with代码块时（无论是正常执行完毕还是发生异常），文件都会自动关闭
""")

# =============== 2. 传统方式与with方式对比 ===============

print("\n2. 传统方式与with方式对比")
print("-"*40)

print("2.1 传统方式（上一课学习的内容）:")
print("""
# 传统方式打开和操作文件
try:
    file = open('example.txt', 'r')
    content = file.read()
    # 处理文件内容...
    file.close()  # 需要手动关闭文件
except Exception as e:
    print(f"发生错误: {e}")
    # 如果在异常处理中忘记关闭文件，文件可能会一直保持打开状态
""")

print("\n2.2 with方式（更优雅、更安全）:")
print("""
# 使用with语句打开和操作文件
try:
    with open('example.txt', 'r') as file:
        content = file.read()
        # 处理文件内容...
        # 无需手动关闭文件，离开with块时自动关闭
except Exception as e:
    print(f"发生错误: {e}")
    # 即使发生异常，文件也会自动关闭
""")

# =============== 3. with语句的嵌套使用 ===============

print("\n3. with语句的嵌套使用")
print("-"*40)

print("3.1 同时打开多个文件:")
try:
    # 创建两个文件用于演示
    with open("with_example.txt", "w") as file1:
        file1.write("这是第一个示例文件的内容\n")
    with open("with_example2.txt", "w") as file2:
        file2.write("这是第二个示例文件的内容\n")
        file2.write("用于演示同时打开多个文件\n")
    
    # 同时打开两个文件
    with open("with_example.txt", "r") as file1, open("with_example2.txt", "r") as file2:
        content1 = file1.read()
        content2 = file2.read()
        
        print("文件1内容长度:", len(content1))
        print("文件2内容长度:", len(content2))
    
    # 两个文件都已自动关闭
    print(f"文件1已关闭: {file1.closed}")  # True
    print(f"文件2已关闭: {file2.closed}")  # True
except Exception as e:
    print(f"处理多个文件时出错: {e}")

# =============== 总结 ===============

print("\n" + "="*60)
print("总结：with上下文管理器")
print("-"*40)
print("""
1. with语句是处理文件的最佳实践，它能自动管理资源，确保文件被正确关闭

2. 基本语法：
   with open(file_path, mode) as file_object:
       # 文件操作代码

3. 相比传统方式的优势：
   - 自动关闭文件，无需显式调用close()
   - 即使发生异常，也能确保资源被释放
   - 代码更简洁、更安全

4. 在AI开发中，文件操作是常见需求，使用with语句可以更可靠地处理：
   - 模型配置文件
   - 训练数据集
   - 预测结果输出
   - 日志记录
""")

print("\n无论是处理小型文本文件还是大型数据集，with语句都是Python文件操作的首选方式。")
print("="*60)
